package cl.ccs.migracionbcmc.dao.impl;

import cl.ccs.migracionbcmc.connection.ConnectionFactory;
import cl.ccs.migracionbcmc.dao.BeneficiariosDao;
import cl.ccs.migracionbcmc.model.Beneficiado;
import cl.ccs.migracionbcmc.model.DatosPersona;
import cl.ccs.migracionbcmc.model.PersonaBeneficiado;
import cl.ccs.migracionbcmc.util.Util;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Types;

import java.util.ArrayList;
import java.util.List;

public class BeneficiariosDaoImpl implements BeneficiariosDao{
    
    private static final int RUT_BENEFICIADO = 1;
    
    
    public BeneficiariosDaoImpl() {
        super();
    }

    /**
     * @param rut
     * @param login
     * @return
     */
    @Override
    public PersonaBeneficiado getBeneficiados(String rut, String login) {
        
        
        PersonaBeneficiado persona = new PersonaBeneficiado();
        DatosPersona datosPersona = new DatosPersona();
        List<Beneficiado> listBeneficiado = new ArrayList<Beneficiado>();
        Beneficiado beneficiado = new Beneficiado();
        if(rut == null) {
            persona.setDatosPersona(datosPersona); 
            persona.setListBeneficiado(listBeneficiado);
            return persona;
        }
        rut = Util.formatRUT(rut);
        
       
        Connection con = null;
        try {
            con = ConnectionFactory.getConnectionSybaseBIC();
            CallableStatement stmNombre = con.prepareCall("{CALL SQ_Nombre_VsNet(?,?,?,?,?,?)}");
            stmNombre.setString(1, rut);
            
            stmNombre.registerOutParameter(2, Types.VARCHAR); //apPaterno
            stmNombre.registerOutParameter(3, Types.VARCHAR); //apMaterno
            stmNombre.registerOutParameter(4, Types.VARCHAR); //nombres
            stmNombre.registerOutParameter(5, Types.INTEGER); //corrNombre
            stmNombre.registerOutParameter(6, Types.INTEGER); //rowCount
            
            stmNombre.execute();
            
            if(stmNombre.getInt(6) > 0){
                datosPersona.setNombre(stmNombre.getString(4));
                datosPersona.setApPaterno(stmNombre.getString(2));
                datosPersona.setApMaterno(stmNombre.getString(3));
    
                persona.setDatosPersona(datosPersona);
            }
            
            
            CallableStatement stm = con.prepareCall("{?=CALL SP_ConsultaBenefCst_ADF(?, ?)}");
            stm.registerOutParameter(1, Types.INTEGER);
            
            stm.setString(2, rut);

            stm.registerOutParameter(3, Types.BIT);
            
            ResultSet rs = stm.executeQuery();

            while (rs.next()) {
                beneficiado = new Beneficiado();
                beneficiado.setOrigen(rs.getString(1)); // Fld_Origen
                beneficiado.setFechaRecepcion(rs.getDate(2)); //Fld_FecRecepcion
                beneficiado.setShowFechaRecepcion(!Util.isBlankDate(beneficiado.getFechaRecepcion()));
                beneficiado.setFechaFiniquito(rs.getDate(3)); //Fld_FecFiniquito
                beneficiado.setShowFechaFiniquito(!Util.isBlankDate(beneficiado.getFechaFiniquito()));
                beneficiado.setFechaTerminoContrato(rs.getDate(4)); // Fld_FecTerminoContrato
                beneficiado.setShowFechaTerminoContrato(!Util.isBlankDate(beneficiado.getFechaTerminoContrato()));
                beneficiado.setFechaTopeBeneficio(rs.getDate(5)); // Fld_FecFinBeneficio
                beneficiado.setShowFechaTopeBeneficio(!Util.isBlankDate(beneficiado.getFechaTopeBeneficio()));
                beneficiado.setProrroga(rs.getBoolean(6)); // Fld_Prorroga
                beneficiado.setFechaIngresoProrroga(rs.getDate(7)); //Fld_FecActualizacion
                if(beneficiado.getProrroga()) {
                    beneficiado.setShowFechaIngresoProrroga(!Util.isBlankDate(beneficiado.getFechaIngresoProrroga()));
                }
               
                beneficiado.setMarcaExtractado(rs.getBoolean(9));
                beneficiado.setFechaCalculo(rs.getDate(10)); 
                beneficiado.setShowFechaCalculo(!Util.isBlankDate(beneficiado.getFechaCalculo()));
                
                boolean beneficioMOL = rs.getBoolean(11);
                boolean beneficioBIC = rs.getBoolean(12);
                if(beneficioMOL && beneficioBIC) {
                   beneficiado.setMarcaBeneficiado("Beneficiado"); 
                }
                
                beneficiado.setFechaBaja(rs.getDate(13));
                beneficiado.setShowFechaBaja(!Util.isBlankDate(beneficiado.getFechaBaja()));
                beneficiado.setEstado(rs.getString(14));
                
                
                listBeneficiado.add(beneficiado);
                
            }
            
            if(listBeneficiado.size() == 0){
                persona.setEstadoPersona("RUT NO ESTA INFORMADO COMO CESANTE");
            }else{
                boolean isBeneficiado = stm.getBoolean(3);
                if(isBeneficiado){
                    persona.setEstadoPersona("RUT BENEFICIADO");
                }else{
                    persona.setEstadoPersona("RUT NO BENEFICIADO");
                }
            }
            
                
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            ConnectionFactory.freeConnection(con);
        }

        persona.setListBeneficiado(listBeneficiado);

        return persona;
    }
}
